package com.ysw.dto;

import com.ysw.constant.ICodeStatus;
import com.ysw.constant.ServiceCodeStatus;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.http.HttpStatus;

import java.io.Serializable;

/**
 * @ClassName ResponseResult
 * @Description 统一响应对象
 * @Author ysw
 * @Date 2022/5/12 18:28
 */
@Data
@Accessors(chain = true)
public class ResponseResult<T> implements Serializable {

    private static final long serialVersionUID = -244934831196041274L;

    private String code;

    private String msg;

    private T data;
    /**
     * 返回成功数据（status：200）
     *
     * @param data 数据内容
     * @param <T>  数据类型
     * @return ResponseResult实例
     */

    public static <T> ResponseResult success(T data){
        return new ResponseResult().setCode(ServiceCodeStatus.SUCCESS.getCode()).setData(data).setMsg(ServiceCodeStatus.SUCCESS.getReasonPhrase());
    }

    /**
     * 返回成功数据（status：200）
     *
     * @return ResponseResult实例
     */
    public static ResponseResult success() {
        return success(null);
    }

    /**
     * 返回错误数据（status：500）
     *
     * @param data 错误内容
     * @param <T>  数据类型
     * @return ResponseResult实例
     */
    public static <T> ResponseResult fail(T data) {
        return new ResponseResult().setCode(ServiceCodeStatus.ERROR.getCode()).setMsg(ServiceCodeStatus.ERROR.getReasonPhrase()).setData(data);
    }

    /**
     * 自定义返回错误数据
     *
     * @param code    错误代码
     * @param message 错误消息
     * @return ResponseResult实例
     */
    public static ResponseResult fail(String code, String message) {
        return new ResponseResult().setCode(code).setMsg(message);
    }

    /**
     * @param code    错误代码
     * @param message 错误消息
     * @param data    错误内容
     * @return ResponseResult实例
     */
    public static ResponseResult fail(String code, String message, String data) {
        return new ResponseResult().setCode(code).setMsg(message).setData(data);
    }

    /**
     * ICodeStatus 提供错误代码错误消息
     * @param codeStatus
     * @return
     */
    public static ResponseResult fail(ICodeStatus codeStatus){
        return new ResponseResult().setCode(codeStatus.getCode()).setMsg(codeStatus.getReasonPhrase());
    }

    /**
     * CodeStatus 提供错误代码错误消息 及返回内容
     * @param codeStatus
     * @param data
     * @param <T>
     * @return
     */
    public static <T> ResponseResult fail(ICodeStatus codeStatus, T data) {
        return new ResponseResult().setCode(codeStatus.getCode()).setMsg(codeStatus.getReasonPhrase()).setData(data);
    }
}